package com.agritech.system;

import com.agritech.path.PathPlan;

/**
 * 导航系统类
 * 单例模式：确保一个类只有一个实例，并提供一个全局访问点
 */
public class NavigationSystem {
    private static volatile NavigationSystem instance; // 使用volatile确保多线程环境下的可见性
    private String currentMapVersion;
    private boolean isNavigating;
    private PathPlan currentPath;
    
    // 私有构造函数，防止外部实例化
    private NavigationSystem() {
        this.currentMapVersion = "v1.0.0-beta";
        this.isNavigating = false;
        System.out.println("导航系统已初始化，地图版本: " + currentMapVersion);
    }
    
    /**
     * 获取导航系统唯一实例
     * 双重检查锁定（Double-Checked Locking）确保线程安全和性能
     * @return 导航系统实例
     */
    public static NavigationSystem getInstance() {
        if (instance == null) { // 第一次检查
            synchronized (NavigationSystem.class) {
                if (instance == null) { // 第二次检查
                    instance = new NavigationSystem();
                }
            }
        }
        return instance;
    }
    
    /**
     * 开始导航
     * @param pathPlan 路径规划
     */
    public void startNavigation(PathPlan pathPlan) {
        if (pathPlan == null || pathPlan.getPathPoints().isEmpty()) {
            System.out.println("导航失败: 无效的路径规划");
            return;
        }
        this.currentPath = pathPlan;
        this.isNavigating = true;
        System.out.println("导航系统已启动，开始沿规划路径行驶");
        currentPath.printPathPlan();
    }
    
    /**
     * 停止导航
     */
    public void stopNavigation() {
        if (isNavigating) {
            this.isNavigating = false;
            System.out.println("导航系统已停止");
        } else {
            System.out.println("导航系统当前未在导航状态");
        }
    }
    
    /**
     * 更新地图版本
     * @param newVersion 新地图版本
     */
    public void updateMap(String newVersion) {
        this.currentMapVersion = newVersion;
        System.out.println("导航系统地图已更新至版本: " + newVersion);
    }
    
    /**
     * 获取当前地图版本
     * @return 当前地图版本
     */
    public String getCurrentMapVersion() {
        return currentMapVersion;
    }
    
    /**
     * 检查是否正在导航
     * @return 是否正在导航
     */
    public boolean isNavigating() {
        return isNavigating;
    }
    
    /**
     * 获取当前路径规划
     * @return 当前路径规划
     */
    public PathPlan getCurrentPath() {
        return currentPath;
    }
}